home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
mac
/
files
/
dsp
/
a5611.tz
/
a5611
/
frac2int.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-11
|
6KB
|
119 lines
#if 0
+----------------------------------------------------------------------+
| Question: My filter design package gives me decimal fractional |
| numbers as output for my FIR filter coefficients. |
| How do I convert these decimal fractions into the |
| DSP56200's format? |
+----------------------------------------------------------------------+
Answer:
It's fairly easy to convert decimal fractions into the
data format required by the DSP56200. The DSP56200 coeffi-
cients are represented as 24-bit signed, fractional, 2's
complement numbers as shown in Table 1.
TABLE 1 - Representations for FIR Filter Coefficients
-----------------------------------------------------
Decimal Hexadecimal
Fraction 24-Bit Binary Value Coefficient
-------- ------------------- ----------
0.75 0.1100000 00000000 00000000 60 00 00
0.5 0.1000000 00000000 00000000 40 00 00
0.25 0.0100000 00000000 00000000 20 00 00
0.125 0.0010000 00000000 00000000 10 00 00
-0.125 1.1110000 00000000 00000000 F0 00 00
-0.75 1.0100000 00000000 00000000 A0 00 00
Each 24-bit coefficient is separated into three bytes
corresponding to the high, middle, and low bytes. The high
byte is written to the DSP56200 at address 0A (hex), the
middle byte to address 0B (hex), and the low byte to address
0C (hex).
Conversion Procedure:
Step 1: Multiply the decimal fraction by 8388608.0 (decimal).
Note that 8388608 = 2 raised to the 23rd power.
Step 2: Truncate or round the result into an integer.
Step 3: Logically AND this integer with 00FFFFFF (hex).
Step 4: Write the result to an output file as a hex integer.
It is easy to write a program to perform this conversion on
a set of coefficients. If done by computer program, make
sure that all integer variables are represented with at
least 24-bits. An example of a short "C" program is
included at the end of this answer.
Things to watch for:
(1) Avoid letting a coefficient value be exactly 800000
(-1.0 in a fractional system). If this coefficient
is multiplied by a data sample with value -1.0, the
result is -1.0 instead of +1.0 as expected. This is
because +1.0 cannot be represented in a signed, 2's
complement, fractional system.
(2) The filter coefficients must be carefully selected
to prevent overflow. If there is a possibility of
overflow with a set of filter coefficients, then all
coefficients must be scaled by a constant value. The
DSP56200's 24-bit coefficients allow plenty of room
for scaling. If 12-bit input data samples are used
in a system, the potential for overflow is greatly
reduced if the samples are right justified and sign-
extended four bits before they are sent to the
DSP56200.
"C" Program:
#endif
/****************************************\
** DECIMAL FRACTION TO HEX CONVERSION **
\****************************************/
/******************************************************************\
* This program converts one decimal, fractional number to a hex *
* number which can be written to the DSP56200's Coefficient RAM *
* Access registers. It prompts the user for a decimal fraction *
* and returns the corresponding hex number. *
* *
* Examples of Program Results (useful for checking programs) *
* Inputs Outputs *
* ------ ------- *
* 0.750 => 600000 *
* 0.500 => 400000 *
* 0.250 => 200000 *
* 0.125 => 100000 *
* -0.125 => f00000 *
* -0.750 => a00000 *
* 0.00784313678741455 => 010101 *
* -0.00784313678741455 => fefeff *
* *
* Note: The program assumes that the variable type "long" is an *
* integer which is at least 24-bits wide. *
* *
* Also: The DSP56200 cannot use any coefficient value with a *
* magnitude of 1.0 or larger. All coefficients must be *
* signed, fractional quantities. *
\******************************************************************/
main()
{
double fractnum; /* double precision floating pt */
long hexval; /* long integer */
for(;;) {
/* Read 1 Decimal Floating Point Number from the Keyboard */
printf("Enter the decimal fraction: ");
scanf("%lf", &fractnum);
/* Convert to a Hex Integer which can be used by the DSP56200 */
hexval = (long) (8388608.0 * fractnum);
hexval = 0x00ffffffL & hexval;
/* Write the Hex number out to the Terminal */
printf("DSP56200 Coefficient = %06lx\n", hexval);
}
}